package com.sky.controller.admin;

import com.sky.dto.DishDTO;
import com.sky.dto.DishPageQueryDTO;
import com.sky.pojo.Dish;
import com.sky.result.Result;
import com.sky.service.DishService;
import com.sky.vo.DishVO;
import com.sky.vo.pageResultVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Set;

@RestController//请求响应控制器
@Slf4j//开启日志记录功能,输出日志到控制台
@RequestMapping("/admin/dish")//url:http://localhost:8080/admin/dish
// -->抽取公共的URL请求资源路
@RequiredArgsConstructor// lombok注解,自动生成构造函数,给final修饰的字段赋值
@Api(tags = "后台果蔬管理相关的接口")//swagger2注解,给当前类添加描述信息
@CrossOrigin//解决跨域问题
public class DishController {
    private final RedisTemplate redisTemplate;
    private final DishService dishService;

    /**
     * **Path：** /admin/dish/page
     * <p>
     * **Method：** GET<br>
     * <p>
     * **接口描述：**<br>
     * <p>
     * <p>
     * ### 请求参数
     * <p>
     * **Query**
     */
    @ApiOperation("果蔬条件分页查询的接口")
    @GetMapping("/page")
    public Result<pageResultVO<DishVO>> dishPage(DishPageQueryDTO dishPageQueryDTO) {
        //1.记录日志
        log.info("查询果蔬分页信息,dishPageQueryDTO={}", dishPageQueryDTO);
        //2.业务:条件分页查询果蔬信息
        pageResultVO<DishVO> pageResultVO = dishService.pageQuery(dishPageQueryDTO);
        //返回统一的响应结果result,将分页查询结果给前端
        return Result.success(pageResultVO);
    }

//    /**
//     * 修改果蔬信息
//     * <p>
//     * **Path：** /admin/dish
//     * <p>
//     * **Method：** PUT
//     * <p>
//     * **接口描述：**
//     * <p>
//     * <p>
//     * ### 请求参数
//     * <p>
//     * **Body**
//     * <p>
//     * application/json
//     */
//    @ApiOperation("修改果蔬信息的接口")
//    @PutMapping
//    public Result<String> updateDish(@RequestBody DishDTO dishDTO) {
//        //1.记录日志
//        log.info("修改果蔬信息,dishDTO={}", dishDTO);
//        //2.业务:修改果蔬信息
//        dishService.updateDish(dishDTO);
//        //3.返回成功消息
//        return Result.success("修改成功");
//    }

    /**
     * 新增果蔬信息
     * ### 基本信息
     * <p>
     * **Path：** /admin/dish<br
     *
     * <p>
     * **Method：** POST<br>
     * <p>
     * **接口描述：**<br>
     * <p>
     * <p>
     * ### 请求参数
     * <p>
     * **Body**
     * <p>
     * application/json
     */
    @ApiOperation("新增果蔬信息的接口")
    @PostMapping
    public Result<String> saveDish(@RequestBody DishDTO dishDTO) {
        //1.记录日志
        log.info("新增果蔬信息,dishDTO={}", dishDTO);
        //2.业务:新增果蔬信息
        dishService.saveDish(dishDTO);
        //2.5.清理redis中的缓存
        //获取要清理缓存的key
        String cleanKey = "dish_" + dishDTO.getCategoryId();
        //清理缓存
        cleanCache(cleanKey);
        //3.返回成功消息
        return Result.success("新增果蔬成功");
    }

    private void cleanCache(String pattern) {
        //清理缓存
        Set keys = redisTemplate.keys(pattern);//获取所有以dish_开头的key
        redisTemplate.delete(keys);//清理所有以dish_开头的key
    }


    /**
     * 删除和批量删除果蔬信息
     * <p>
     * **Path：** /admin/dish<br>
     * <p>
     * **Method：** DELETE<br>
     * <p>
     * **接口描述：**<br>
     * <p>
     * <p>
     * ### 请求参数
     * <p>
     * **Query**
     * <p>
     * 批量删除：ids=1,2,3,4,5
     * <p>
     * 单个删除：id=1
     */
    @ApiOperation("删除和批量删除果蔬信息的接口")
    @DeleteMapping
    //数组/集合来接收请求参数,需要用@RequestParam注解标注,否则会报错
    public Result<String> deleteDish(@RequestParam List<Long> ids) {
        //1.记录日志
        log.info("删除果蔬信息,ids={}", ids);
        //2.业务:删除果蔬信息
        dishService.deleteDish(ids);
        //获取要清理缓存的key
        String cleanKey = "dish_*";
        //清理缓存
        cleanCache(cleanKey);
        //3.返回成功消息
        return Result.success("删除/批量删除果蔬成功");


    }

    /**
     * 根据ID查询果蔬信息
     * 用于前端展示详情页面-->查询回显
     * <p>
     * **Path：** /admin/dish/{id}<br>
     * <p>
     * **Method：** GET<br>
     * <p>
     * <b>请求参数:路径参数id</b>
     */
    @ApiOperation("根据ID查询果蔬信息的接口")
    @GetMapping("/{id}")
    public Result<DishVO> getDishById(@PathVariable Long id) {
        //1.记录日志
        log.info("查询果蔬信息,id={}", id);
        //2.业务:根据ID查询果蔬信息
        DishVO dishVO = dishService.getDishById(id);
        //3.返回成功消息
        return Result.success(dishVO);
    }

    /**
     * 根据分类ID查询果蔬信息
     * **Path：** /admin/dish/list
     * <p>
     * **Method：** GET
     * <p>
     * **接口描述：**
     * <p>
     * <p>
     * ### 请求参数 -->categoryId
     * <p>
     * **Query**
     */
    @ApiOperation("根据分类ID查询果蔬信息的接口")
    @GetMapping("/list")
    public Result<List<Dish>> listDishByCategoryId(Long categoryId) {
        //1.记录日志
        log.info("查询果蔬信息,categoryId={}", categoryId);
        //2.业务:根据分类ID查询果蔬信息
        List<Dish> dishList = dishService.listDishByCategoryId(categoryId);
        //3.返回成功消息
        return Result.success(dishList);

    }

    /**
     * 根据果蔬id和状态,起售/停售果蔬
     * <p>
     * **Path：** /admin/dish/status/{status}
     * <p>
     * **Method：** POST
     * <p>
     * **路径参数**<br>
     * status: 0/1,0表示停售,1表示起售<br>
     * **请求参数**<br>
     * **Query**
     * 用@RequestParam注解标注,否则要名称和类型都一致才行
     * <p>
     * id: 果蔬id
     */
    @ApiOperation("根据果蔬id和状态(0/1),起售/停售果蔬的接口")
    @PostMapping("/status/{status}")
    public Result<String> updateStatus(@PathVariable Integer status, Long id) {
        //1.记录日志
        log.info("修改果蔬状态,status={},id={}", status, id);
        //2.业务:根据果蔬id和状态,起售/停售果蔬
        dishService.updateStatus(status, id);
        //获取要清理缓存的key
        String cleanKey = "dish_*";
        //清理缓存
        cleanCache(cleanKey);
        //3.返回成功消息
        return Result.success("起售/停售果蔬成功");
    }

    /**
     * 修改果蔬
     * <p>
     * **Path：** /admin/dish
     * <p>
     * **Method：** PUT
     * <p>
     * **接口描述：**
     * <p>
     * <p>
     * ### 请求参数
     * <p>
     * **Headers**
     * <p>
     * | 参数名称     | 参数值           | 是否必须 | 示例 | 备注 |
     * | ------------ | ---------------- | -------- | ---- | ---- |
     * | Content-Type | application/json | 是       |      |      |
     * <p>
     * **Body**
     */
    @ApiOperation("修改果蔬信息的接口")
    @PutMapping
    public Result<String> updateDish(@RequestBody DishDTO dshDTO) {
        //1.记录日志
        log.info("修改果蔬信息,dish={}", dshDTO);
        //2.业务:修改果蔬信息
        dishService.updateDish(dshDTO);
        //获取要清理缓存的key
        String cleanKey = "dish_*";
        //清理缓存
        cleanCache(cleanKey);
        //3.返回成功消息
        return Result.success("修改果蔬成功");

    }


}
